// 公共过滤器,不可更改

// 手机号格式化
export function telFormat(data) {
  if (data) {
    return data.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
  }
}

// 手机号后4位显示*
export function telFormatEnd(data) {
  if (data) {
    return (data + "").substr(0, 7) + "****";
  }
}

// 姓名只显示姓
export function firstName(data) {
  if (data) {
    return (data + "").substr(0, 1) + "**";
  }
}

// 文本处理
export function textFormat(data) {
  let len = data.replace(/\s+/g, "").length;
  if (len > 40) {
    data = data.substr(0, 37) + "...";
  }
  return data;
}

// topTab页签中数字处理（大于99时返回99+）
export function topTabsNumber(data) {
  if (data > 99) {
    return "99+";
  }
  return data;
}

//百分数转小数
export function PercentToPoint(num) {
  num = num.toString();
  let str = num.replace("%", "");
  if (!isNaN(str)) {
    str /= 100;
    return str;
  } else {
    return "数据格式不正确！";
  }
}

// 数字转换中文
export function coinFormat(dValue, isNoRMB) {
  isNoRMB = isNoRMB || "1";
  //isNoRMB 是否非人民币  1是
  var maxDec = 2;
  // 验证输入金额数值或数值字符串：
  dValue = dValue.toString().replace(/,/g, "");
  dValue = dValue.replace(/^0+/, ""); // 金额数值转字符、移除逗号、移除前导零
  if (dValue == "") {
    if (isNoRMB != "1") {
      return "零";
    } else {
      return "零元整";
    }
  } // （错误：金额为空！）
  else if (isNaN(dValue)) {
    return "错误:金额不是合法的数值！";
  }
  var minus = ""; // 负数的符号“-”的大写：“负”字。可自定义字符，如“（负）”。
  var CN_SYMBOL = ""; // 币种名称（如“人民币”，默认空）
  if (dValue.length > 1) {
    if (dValue.indexOf("-") == 0) {
      dValue = dValue.replace("-", "");
      minus = "负";
    } // 处理负数符号“-”
    if (dValue.indexOf("+") == 0) {
      dValue = dValue.replace("+", "");
    } // 处理前导正数符号“+”（无实际意义）
  }
  // 变量定义：
  var vInt = "";
  var vDec = ""; // 字符串：金额的整数部分、小数部分
  var resAIW; // 字符串：要输出的结果
  var parts; // 数组（整数部分.小数部分），length=1时则仅为整数。
  var digits, radices, bigRadices, decimals; // 数组：数字（0~9——零~玖）；基（十进制记数系统中每个数字位的基是10——拾,佰,仟）；大基（万,亿,兆,京,垓,杼,穰,沟,涧,正）；辅币（元以下，角/分/厘/毫/丝）。
  var zeroCount; // 零计数
  var i, p, d; // 循环因子；前一位数字；当前位数字。
  var quotient, modulus; // 整数部分计算用：商数、模数。
  // 金额数值转换为字符，分割整数部分和小数部分：整数、小数分开来搞（小数部分有可能四舍五入后对整数部分有进位）。
  var NoneDecLen =
    typeof maxDec == "undefined" ||
    maxDec == null ||
    Number(maxDec) < 0 ||
    Number(maxDec) > 5; // 是否未指定有效小数位（true/false）
  parts = dValue.split("."); // 数组赋值：（整数部分.小数部分），Array的length=1则仅为整数。
  if (parts.length > 1) {
    vInt = parts[0];
    vDec = parts[1]; // 变量赋值：金额的整数部分、小数部分
    if (NoneDecLen) {
      maxDec = vDec.length > 5 ? 5 : vDec.length;
    } // 未指定有效小数位参数值时，自动取实际小数位长但不超5。
    var rDec = Number("0." + vDec);
    rDec *= Math.pow(10, maxDec);
    rDec = Math.round(Math.abs(rDec));
    rDec /= Math.pow(10, maxDec); // 小数四舍五入
    var aIntDec = rDec.toString().split(".");
    if (Number(aIntDec[0]) == 1) {
      vInt = (Number(vInt) + 1).toString();
    } // 小数部分四舍五入后有可能向整数部分的个位进位（值1）
    if (aIntDec.length > 1) {
      vDec = aIntDec[1];
    } else {
      vDec = "";
    }
  } else {
    vInt = dValue;
    vDec = "";
    if (NoneDecLen) {
      maxDec = 0;
    }
  }
  if (vInt.length > 44) {
    return (
      "错误：金额值太大了！整数位长【" +
      vInt.length.toString() +
      "】超过了上限——44位/千正/10^43（注：1正=1万涧=1亿亿亿亿亿，10^40）！"
    );
  }
  // 准备各字符数组 Prepare the characters corresponding to the digits:
  digits = new Array(
    "零",
    "壹",
    "贰",
    "叁",
    "肆",
    "伍",
    "陆",
    "柒",
    "捌",
    "玖"
  ); // 零~玖
  radices = new Array("", "拾", "佰", "仟"); // 拾,佰,仟
  bigRadices = new Array(
    "",
    "万",
    "亿",
    "兆",
    "京",
    "垓",
    "杼",
    "穰",
    "沟",
    "涧",
    "正"
  ); // 万,亿,兆,京,垓,杼,穰,沟,涧,正
  decimals = new Array("角", "分", "厘", "毫", "丝"); // 角/分/厘/毫/丝
  resAIW = ""; // 开始处理
  // 处理整数部分（如果有）
  if (Number(vInt) > 0) {
    zeroCount = 0;
    for (i = 0; i < vInt.length; i++) {
      p = vInt.length - i - 1;
      d = vInt.substr(i, 1);
      quotient = p / 4;
      modulus = p % 4;
      if (d == "0") {
        zeroCount++;
      } else {
        if (zeroCount > 0) {
          resAIW += digits[0];
        }
        zeroCount = 0;
        resAIW += digits[Number(d)] + radices[modulus];
      }
      if (modulus == 0 && zeroCount < 4) {
        resAIW += bigRadices[quotient];
      }
    }
    if (isNoRMB == "1") {
      resAIW += "元";
    }
  }

  if (isNoRMB != "1") {
    if (resAIW == "") {
      resAIW = "零";
    }
    // 处理小数部分（如果有）
    for (i = 0; i < vDec.length; i++) {
      if (i < 1) {
        resAIW += "点";
      }
      d = vDec.substr(i, 1);
      resAIW += digits[Number(d)];
    }
    resAIW = CN_SYMBOL + minus + resAIW; // 人民币/负……元角分/整
    return resAIW;
  } else {
    // 处理小数部分（如果有）
    for (i = 0; i < vDec.length; i++) {
      d = vDec.substr(i, 1);
      if (d != "0") {
        resAIW += digits[Number(d)] + decimals[i];
      }
    }
    // 处理结果
    if (resAIW == "") {
      resAIW = "零" + "元";
    } // 零元
    if (vDec == "") {
      resAIW += "整";
    } // …元整
    resAIW = CN_SYMBOL + minus + resAIW; // 人民币/负……元角分/整
    return resAIW;
  }
}

// 数字转换中文大写圆
export function coinFormat2(dValue, isNoRMB) {
  isNoRMB = isNoRMB || "1";
  //isNoRMB 是否非人民币  1是
  var maxDec = 2;
  // 验证输入金额数值或数值字符串：
  dValue = dValue.toString().replace(/,/g, "");
  dValue = dValue.replace(/^0+/, ""); // 金额数值转字符、移除逗号、移除前导零
  if (dValue == "") {
    if (isNoRMB != "1") {
      return "零";
    } else {
      return "零圆整";
    }
  } // （错误：金额为空！）
  else if (isNaN(dValue)) {
    return "错误:金额不是合法的数值！";
  }
  var minus = ""; // 负数的符号“-”的大写：“负”字。可自定义字符，如“（负）”。
  var CN_SYMBOL = ""; // 币种名称（如“人民币”，默认空）
  if (dValue.length > 1) {
    if (dValue.indexOf("-") == 0) {
      dValue = dValue.replace("-", "");
      minus = "负";
    } // 处理负数符号“-”
    if (dValue.indexOf("+") == 0) {
      dValue = dValue.replace("+", "");
    } // 处理前导正数符号“+”（无实际意义）
  }
  // 变量定义：
  var vInt = "";
  var vDec = ""; // 字符串：金额的整数部分、小数部分
  var resAIW; // 字符串：要输出的结果
  var parts; // 数组（整数部分.小数部分），length=1时则仅为整数。
  var digits, radices, bigRadices, decimals; // 数组：数字（0~9——零~玖）；基（十进制记数系统中每个数字位的基是10——拾,佰,仟）；大基（万,亿,兆,京,垓,杼,穰,沟,涧,正）；辅币（圆以下，角/分/厘/毫/丝）。
  var zeroCount; // 零计数
  var i, p, d; // 循环因子；前一位数字；当前位数字。
  var quotient, modulus; // 整数部分计算用：商数、模数。
  // 金额数值转换为字符，分割整数部分和小数部分：整数、小数分开来搞（小数部分有可能四舍五入后对整数部分有进位）。
  var NoneDecLen =
    typeof maxDec == "undefined" ||
    maxDec == null ||
    Number(maxDec) < 0 ||
    Number(maxDec) > 5; // 是否未指定有效小数位（true/false）
  parts = dValue.split("."); // 数组赋值：（整数部分.小数部分），Array的length=1则仅为整数。
  if (parts.length > 1) {
    vInt = parts[0];
    vDec = parts[1]; // 变量赋值：金额的整数部分、小数部分
    if (NoneDecLen) {
      maxDec = vDec.length > 5 ? 5 : vDec.length;
    } // 未指定有效小数位参数值时，自动取实际小数位长但不超5。
    var rDec = Number("0." + vDec);
    rDec *= Math.pow(10, maxDec);
    rDec = Math.round(Math.abs(rDec));
    rDec /= Math.pow(10, maxDec); // 小数四舍五入
    var aIntDec = rDec.toString().split(".");
    if (Number(aIntDec[0]) == 1) {
      vInt = (Number(vInt) + 1).toString();
    } // 小数部分四舍五入后有可能向整数部分的个位进位（值1）
    if (aIntDec.length > 1) {
      vDec = aIntDec[1];
    } else {
      vDec = "";
    }
  } else {
    vInt = dValue;
    vDec = "";
    if (NoneDecLen) {
      maxDec = 0;
    }
  }
  if (vInt.length > 44) {
    return (
      "错误：金额值太大了！整数位长【" +
      vInt.length.toString() +
      "】超过了上限——44位/千正/10^43（注：1正=1万涧=1亿亿亿亿亿，10^40）！"
    );
  }
  // 准备各字符数组 Prepare the characters corresponding to the digits:
  digits = new Array(
    "零",
    "壹",
    "贰",
    "叁",
    "肆",
    "伍",
    "陆",
    "柒",
    "捌",
    "玖"
  ); // 零~玖
  radices = new Array("", "拾", "佰", "仟"); // 拾,佰,仟
  bigRadices = new Array(
    "",
    "万",
    "亿",
    "兆",
    "京",
    "垓",
    "杼",
    "穰",
    "沟",
    "涧",
    "正"
  ); // 万,亿,兆,京,垓,杼,穰,沟,涧,正
  decimals = new Array("角", "分", "厘", "毫", "丝"); // 角/分/厘/毫/丝
  resAIW = ""; // 开始处理
  // 处理整数部分（如果有）
  if (Number(vInt) > 0) {
    zeroCount = 0;
    for (i = 0; i < vInt.length; i++) {
      p = vInt.length - i - 1;
      d = vInt.substr(i, 1);
      quotient = p / 4;
      modulus = p % 4;
      if (d == "0") {
        zeroCount++;
      } else {
        if (zeroCount > 0) {
          resAIW += digits[0];
        }
        zeroCount = 0;
        resAIW += digits[Number(d)] + radices[modulus];
      }
      if (modulus == 0 && zeroCount < 4) {
        resAIW += bigRadices[quotient];
      }
    }
    if (isNoRMB == "1") {
      resAIW += "圆";
    }
  }

  if (isNoRMB != "1") {
    if (resAIW == "") {
      resAIW = "零";
    }
    // 处理小数部分（如果有）
    for (i = 0; i < vDec.length; i++) {
      if (i < 1) {
        resAIW += "点";
      }
      d = vDec.substr(i, 1);
      resAIW += digits[Number(d)];
    }
    resAIW = CN_SYMBOL + minus + resAIW; // 人民币/负……圆角分/整
    return resAIW;
  } else {
    // 处理小数部分（如果有）
    for (i = 0; i < vDec.length; i++) {
      d = vDec.substr(i, 1);
      if (d != "0") {
        resAIW += digits[Number(d)] + decimals[i];
      }
    }
    // 处理结果
    if (resAIW == "") {
      resAIW = "零" + "圆";
    } // 零圆
    if (vDec == "") {
      resAIW += "整";
    } // …圆整
    resAIW = CN_SYMBOL + minus + resAIW; // 人民币/负……圆角分/整
    return resAIW;
  }
}

function pluralize(time, label) {
  if (time === 1) {
    return time + label;
  }
  return time + label + "s";
}

export function timeAgo(time) {
  const between = Date.now() / 1000 - Number(time);
  if (between < 3600) {
    return pluralize(~~(between / 60), " minute");
  } else if (between < 86400) {
    return pluralize(~~(between / 3600), " hour");
  } else {
    return pluralize(~~(between / 86400), " day");
  }
}

/* 数字 格式化 */
export function numberFormatter(num, digits) {
  const si = [
    { value: 1e18, symbol: "E" },
    { value: 1e15, symbol: "P" },
    { value: 1e12, symbol: "T" },
    { value: 1e9, symbol: "G" },
    { value: 1e6, symbol: "M" },
    { value: 1e3, symbol: "k" }
  ];
  for (let i = 0; i < si.length; i++) {
    if (num >= si[i].value) {
      return (
        (num / si[i].value + 0.1)
          .toFixed(digits)
          .replace(/\.0+$|(\.[0-9]*[1-9])0+$/, "$1") + si[i].symbol
      );
    }
  }
  return num.toString();
}

export function toThousandFilter(num) {
  return (+num || 0)
    .toString()
    .replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ","));
}

// 转换文本域空格和换行
export function changetextArea(text) {
  let textString;
  textString = text.replace(/<br\s*\/?>/gi, "\n").replace(/&nbsp;/gi, " ");
  return textString;
}

// 时间格式化
export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null;
  }
  const format = cFormat || "{y}-{m}-{d} {h}:{i}:{s}";
  let date;
  if (typeof time === "object") {
    date = time;
  } else {
    if (typeof time === "string" && /^[0-9]+$/.test(time)) {
      time = parseInt(time);
    }
    if (typeof time === "number" && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  };
  const timeStr = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === "a") {
      return ["日", "一", "二", "三", "四", "五", "六"][value];
    }
    if (result.length > 0 && value < 10) {
      value = "0" + value;
    }
    return value || 0;
  });
  return timeStr;
}

export function formatTime(time, option) {
  time = +time * 1000;
  const d = new Date(time);
  const now = Date.now();

  const diff = (now - d) / 1000;

  if (diff < 30) {
    return "刚刚";
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + "分钟前";
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + "小时前";
  } else if (diff < 3600 * 24 * 2) {
    return "1天前";
  }
  if (option) {
    return parseTime(time, option);
  } else {
    return (
      d.getMonth() +
      1 +
      "月" +
      d.getDate() +
      "日" +
      d.getHours() +
      "时" +
      d.getMinutes() +
      "分"
    );
  }
}
